package com.example.leetcode.c1_c100.c86;
/**
 * 给定一个链表和一个特定值 x，对链表进行分隔，使得所有小于 x 的节点都在大于或等于 x 的节点之前。
 *
 * 你应当保留两个分区中每个节点的初始相对位置。
 *
 *  
 *
 * 示例:
 *
 * 输入: head = 1->4->3->2->5->2, x = 3
 * 输出: 1->2->2->4->3->5
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/partition-list
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

import com.example.leetcode.common.ListNode;
import com.example.leetcode.common.ListOperate;

/**
 * 分隔链表
 * @author zhanpengguo
 * @date 2020-09-29 15:56
 */
public class Solution {

    public ListNode partition(ListNode head, int x) {
        ListNode temp1 = new ListNode(-1);
        ListNode temp2 = new ListNode(-1);
        ListNode small = temp1;
        ListNode big = temp2;
        while (head != null) {
            if (head.val < x) {
                small.next = new ListNode(head.val);
                small = small.next;
            } else {
                big.next = new ListNode(head.val);
                big = big.next;
            }
            head = head.next;
        }
        big.next = null;
        small.next = temp2.next;
        return temp1.next;
    }

    public static void main(String[] args) {
        ListNode head = ListOperate.create(new int[]{1, 4, 3, 2, 5, 2});
        Solution solution = new Solution();
        ListNode node = solution.partition(head, 0);
        ListOperate.show(node);
    }
}
